package m.system.util;

import m.common.model.Model;
import m.common.model.util.ModelUtil;
import m.system.RuntimeData;
import m.system.exception.MException;
import m.system.lang.IJsonOuter;

import java.util.Date;
import java.util.List;
import java.util.Map;

public class SystemUtil {
    /**
     * 调试模式才输出，控制台输出内容
     */
    public static void print(Object... txt){
        printIf(RuntimeData.getDebug(),txt);
    }
    /**
     * 控制台输出内容
     */
    public static void printIf(boolean debug,Object... txt){
        if(debug) {
            StringBuilder s=new StringBuilder();
            for (Object t : txt) {
                s.append(toPrint(t));
            }
            System.out.print(s);
        }
    }
    /**
     * 调试模式才输出，控制台输出内容 并换行
     */
    public static void println(Object... txt){
        printlnIf(RuntimeData.getDebug(),txt);
    }

    /**
     * 打印空行
     */
    public static void println(){
        printlnIf(RuntimeData.getDebug());
    }
    /**
     * 控制台输出内容 并换行
     */
    public static void printlnIf(boolean debug,Object... txt){
        if(debug) {
            StringBuilder s=new StringBuilder();
            for (Object t : txt) {
                s.append(toPrint(t));
            }
            System.out.println(s);
        }
    }
    private static String toPrint(Object value){
        if(null==value){
            return "<null>";
        }else if(value instanceof Date){
            return DateUtil.format((Date) value, DateUtil.YYYY_MM_DD_HH_MM_SS);
        }else if(value instanceof Object[]){
            return ArrayUtil.toString((Object[])value);
        }else if(value instanceof List){
            return ArrayUtil.toString((List<Object>)value);
        }else if(value instanceof IJsonOuter){
            return ((IJsonOuter)value).toJSONString();
        }else if(value instanceof Map){
            return new JSONMessage((Map<String, Object>) value).toJSONString();
        }else if(value instanceof Model){
            try {
                return ModelUtil.toJSONMessage("",(Model)value).toJSONString();
            } catch (MException e) {
                return "输出Model失败："+value.getClass();
            }
        }else{
            return value.toString();
        }
    }

    /**
     * 打印错误到控制台
     */
    public static void printErr(Object... txt){
        StringBuilder s=new StringBuilder();
        for (Object t : txt) {
            s.append(toPrint(t));
        }
        System.err.println(s);
    }
}
